package gambit.jogador;


import gambit.core.Tabuleiro;

import java.util.ArrayList;
import java.util.Random;

public class Jogador implements view.Jogador{

	private String nomeJogador;
	private int numPly = 1;
	private boolean aprendizado = false;
	private boolean oponente = false;
	private boolean possivelContinuar = true;

	private Minimax m;
	private Aprendizado a;
	private Random r = new Random();
	
	public Jogador(){
		this("jogador", false, 1, false);
	}
	
	public Jogador(String nomeJogador){
		this(nomeJogador, false, 1, false);
	}
	
	public Jogador(String nomeJogador, int numPly, boolean hasAprendizado){
		this(nomeJogador, false, numPly, hasAprendizado);
	}

	public Jogador(String nomeJogador, boolean isOponente, int numPly, boolean hasAprendizado) {

		this.nomeJogador = nomeJogador;
		this.oponente = isOponente;
		if(hasAprendizado)
			this.aprendizado = hasAprendizado;
			a = new Aprendizado(nomeJogador);
		
		if (numPly >= 0)
			this.numPly = numPly;
	}

	public int[] jogar(int[] casasTabuleiro) {
		
		Tabuleiro tabuleiro = new Tabuleiro(casasTabuleiro);

		if(oponente)
			tabuleiro = Tabuleiro.inverter(tabuleiro);
		
		ArrayList<Tabuleiro> listaPossiveisJogadas = tabuleiro.listarPossiveisJogadas();
		int numPossiveisJogadas = listaPossiveisJogadas.size();
		if(numPossiveisJogadas == 0){
			possivelContinuar = false;
			return null;
		}

		switch (numPly) {

		case 0:
			int jogadaEscolhida = r.nextInt(numPossiveisJogadas);
			tabuleiro = listaPossiveisJogadas.get(jogadaEscolhida);
			break;

		case 1:
			tabuleiro = listaPossiveisJogadas.get(0);
			int custoMax = Utilidade.getCusto(tabuleiro);
			for (Tabuleiro t : listaPossiveisJogadas) {
				if (Utilidade.getCusto(t) > custoMax)
					tabuleiro = t;
			}
			break;

		default:
			m = new Minimax(numPly);
			m.arvore(tabuleiro, numPly);
			tabuleiro = m.melhorJogada();
			break;
		}
		
		if(aprendizado) 
			a.atualizar(tabuleiro);

		return oponente ? Tabuleiro.inverter(tabuleiro).getCasas() : tabuleiro.getCasas();
	}
	
	public void aprender(){
		a.persistir(!possivelContinuar);
	}

	public boolean isPossivelContinuar() {
		return possivelContinuar;
	}

	public void setPossivelContinuar(boolean possivelContinuar) {
		this.possivelContinuar = possivelContinuar;
	}


	public boolean isAprendizado() {
		return aprendizado;
	}

	public void setAprendizado(boolean aprendizado) {
		this.aprendizado = aprendizado;
	}

	public String getNomeJogador() {
		return nomeJogador;
	}

	public void setNomeJogador(String nomeJogador) {
		this.nomeJogador = nomeJogador;
	}

}
